/**
 * 
 */
package modelo.geometria;

public class Rectangulo extends Figura {

	private Vector centro;
	private SegmentoRecta[] lados;
	private double largo;
	private double ancho;
	
	public Rectangulo(Vector centro, double largo, double ancho) {
		
		this.centro = centro;
		this.largo = largo;
		this.ancho = ancho;
		
		Vector arribaIzquierda = new Vector(centro.getX() - ancho/2, centro.getY() + largo/2);
		Vector arribaDerecha = new Vector(centro.getX() + ancho/2, centro.getY() + largo/2);
		Vector abajoIzquierda = new Vector(centro.getX() - ancho/2, centro.getY() - largo/2);
		Vector abajoDerecha = new Vector(centro.getX() + ancho/2, centro.getY() - largo/2);
		
		/*
		ladoArriba = new SegmentoRecta(arribaIzquierda, arribaDerecha);
		ladoAbajo = new SegmentoRecta(abajoIzquierda, abajoDerecha);
		ladoIzquierdo = new SegmentoRecta(arribaIzquierda, abajoIzquierda);
		ladoDerecho = new SegmentoRecta(arribaDerecha, abajoDerecha);
		*/

		lados = new SegmentoRecta[4];
		lados[0] = new SegmentoRecta(arribaIzquierda, arribaDerecha); 	// lado de arriba
		lados[1] = new SegmentoRecta(abajoIzquierda, abajoDerecha); 	// lado de abajo
		lados[2] = new SegmentoRecta(arribaIzquierda, abajoIzquierda); 	// lado de la izquierda
		lados[3] = new SegmentoRecta(arribaDerecha, abajoDerecha); 		// lado de la derecha
		
	}
	
	@Override
	public Vector getCentro() {
		return centro;
	}
	
	@Override
	public boolean solapa(Rectangulo otroRectangulo) {
		// devuelve true si tenemos dos rectangulos que se tocan, o si hay uno dentro de otro
		
		// si se tocan
		for (int i = 0; i < 4; i++)
			for (int j = 0; j < 4; j++)
				if (lados[i].intercepta(otroRectangulo.lados[j])) return true;
		
		// si hay uno dentro del otro
		return centro.getDistancia(otroRectangulo.centro) <=
			Math.max(Math.max(largo, ancho), Math.max(otroRectangulo.largo, otroRectangulo.ancho));
	
	}
	
	public double getLargo() {
		return largo;
	}
	
	public double getAncho() {
		return ancho;
	}

	@Override
	public boolean solapa(SegmentoRecta segmentoRecta) {
		return segmentoRecta.solapa(this);
	}

	@Override
	public boolean solapa(Circunferencia circunferencia) {
		return circunferencia.solapa(this);
	}

	public boolean solapa(Vector posicion) {

		Vector abajoIzquierda = lados[2].punto2();
		return (posicion.getX() > abajoIzquierda.getX() && posicion.getX() < abajoIzquierda.getX() + ancho 
				&& posicion.getY() > abajoIzquierda.getY() && posicion.getY() < abajoIzquierda.getY() + largo);
	}

	@Override
	public boolean solapa(Figura otraFigura) {
		otraFigura.solapa(this);
		return false;
	}

	@Override
	public Figura mover(final Vector nuevaPosicion) {
		this.centro.setX(nuevaPosicion.getX());
		this.centro.setY(nuevaPosicion.getY());
						
		Vector arribaIzquierda = new Vector(centro.getX() - ancho/2, centro.getY() + largo/2);
		Vector arribaDerecha = new Vector(centro.getX() + ancho/2, centro.getY() + largo/2);
		Vector abajoIzquierda = new Vector(centro.getX() - ancho/2, centro.getY() - largo/2);
		Vector abajoDerecha = new Vector(centro.getX() + ancho/2, centro.getY() - largo/2);
		
		
		lados = new SegmentoRecta[4];
		lados[0] = new SegmentoRecta(arribaIzquierda, arribaDerecha); 	
		lados[1] = new SegmentoRecta(abajoIzquierda, abajoDerecha); 	
		lados[2] = new SegmentoRecta(arribaIzquierda, abajoIzquierda); 	
		lados[3] = new SegmentoRecta(arribaDerecha, abajoDerecha); 		
	
		return this;
	}
}